package com.lyb.course.service.impl;

import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import com.lyb.course.domain.CourseType;
import com.lyb.course.mapper.CourseTypeMapper;
import com.lyb.course.service.ICourseTypeService;
import com.lyb.course.vo.CrumbsVO;
import com.lyb.hrm.constants.RedisKeyConstants;
import com.lyb.hrm.feignclients.PageStaticFeignClient;
import com.lyb.hrm.feignclients.RedisFeignClient;
import com.lyb.hrm.util.AjaxResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * <p>
 * 课程目录 服务实现类
 * </p>
 *
 * @author lyb
 * @since 2020-02-17
 */
@Service
public class CourseTypeServiceImpl extends ServiceImpl<CourseTypeMapper, CourseType> implements ICourseTypeService {

    @Autowired
    private RedisFeignClient redisFeignClient;

    @Autowired
    private PageStaticFeignClient pageStaticFeignClient ;

    @Override
    public boolean insert(CourseType entity) {

        boolean insertSuccess = super.insert(entity);

        //重置Redis
        //查询mysql中的课程分类
        //把课程分类放到Redeis
        resetRedisForCourseType();

        //触发页面静态化
        triggerPageStatic();

        return insertSuccess;
    }

    @Override
    public boolean deleteById(Serializable id) {
        boolean deleteSuccess = super.deleteById(id);
        //重置Redis
        //查询mysql中的课程分类
        //把课程分类放到Redeis
        resetRedisForCourseType();

        //触发页面静态化
        triggerPageStatic();

        return deleteSuccess;
    }

    @Override
    public boolean updateById(CourseType entity) {
        boolean updateSuccess = super.updateById(entity);
        //重置Redis
        //查询mysql中的课程分类
        //把课程分类放到Redeis
        resetRedisForCourseType();

        //触发页面静态化
        triggerPageStatic();

        return updateSuccess;
    }

    // 触发课程首页页面静态化
    public void triggerPageStatic(){
        // 准备页面需要的数据，存储到Redis
        List<CourseType> courseTypes = this.treeData();
        // 准备参数 redis的key和t_page的name
        String pageName = "home";
        // 封装数据的map
        Map<String,Object> model = new HashMap<>();
        model.put("courseTypes",courseTypes);

        AjaxResult ajaxResult = redisFeignClient.set(RedisKeyConstants.COURSE_TYPES_PAGE_STATIC, JSON.toJSONString(model));
        if(!ajaxResult.isSuccess()){
            throw new RuntimeException("页面静态化数据准备失败"+ajaxResult.getMessage());
        }

        // 通过Feign调用页面静态化服务,触发页面静态化
        AjaxResult ajaxResultPageStatic = pageStaticFeignClient.pageStatic(pageName, RedisKeyConstants.COURSE_TYPES_PAGE_STATIC);
        if(!ajaxResultPageStatic.isSuccess()){
            throw new RuntimeException("页面静态化失败："+ajaxResultPageStatic.getMessage());
        }
    }

    // 重置Redis中的课程分类
    private  List<CourseType>  resetRedisForCourseType(){
        // 如果Reids没有就从Mysql中查
        List<CourseType> courseTypes = baseMapper.selectList(null);
        // Mysql查到之后同步一份到Redis
        redisFeignClient.set(RedisKeyConstants.COURSE_TYPE,JSON.toJSONString(courseTypes));
        return courseTypes;
    }

    @Override
    public List<CourseType> treeData() {
        List<CourseType> courseTypes = null;
        // 查询课程分类的时候先查询Redis
        AjaxResult ajaxResult = redisFeignClient.get(RedisKeyConstants.COURSE_TYPE);
        // 判断是否有结果
        if(ajaxResult.isSuccess() && null != ajaxResult.getResultObj()){
            // 如果Redis有就直接返回
            String jsonFromRedis = ajaxResult.getResultObj().toString();

            // 放没有处理过的list
            courseTypes = JSON.parseArray(jsonFromRedis , CourseType.class);
        }else{
            courseTypes = resetRedisForCourseType();
        }
        // 查询所有的课程类型
        //List<CourseType> courseTypes = baseMapper.selectList(null);

        // 过滤一级分类
        // 用来封装一级分类，当然每个一级分类的children中有其子分类
        List<CourseType> primaryCourseType = new ArrayList<>();
        for(CourseType courseType : courseTypes){
            // 如果pid == 0那就是一级分类
            if(courseType.getPid().longValue() == 0){
                primaryCourseType.add(courseType);
            }else{
                // 如果不是一级分类，就要找到自己的父分类，装到父分类的 children
                CourseType currentPrimaryCourseType = null;
                // 还是遍历所有的元素
                for(CourseType pcourseType : courseTypes ){
                    if(courseType.getPid().longValue() == pcourseType.getId().longValue()){
                        // 如果当前分类的pid和某个分类的id相等，那么这个某个分类就是当前分类的父分类
                        currentPrimaryCourseType = pcourseType;
                        break;
                    }
                }
                if(currentPrimaryCourseType != null){
                    // 如果找到了父分类，就把当前分类加入父分类的children中
                    currentPrimaryCourseType.getChildren().add(courseType);
                }
            }
        }
        return primaryCourseType;
    }

    @Override
    public List<CrumbsVO> crumbs(Long id) {
        return null;
    }
}
